package com.youcan.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;



/**
 * @author LiChao E-mail:what_is_javascript@163.com
 * @date:2012-8-20 下午11:19:22
 * @version :V1.0
 *
 */
public interface BaseDao <T>{
	/**
	 * 持久化对象
	 */
	public T save(T object);
	/**
	 * 根据hql、sql进行保存
	 */
	public boolean addByHql(String hql);
	public boolean addBySql(String sql);
	
	/**
	 * 采用hql、sql语句进行删除,修改操作
	 * @param hql
	 * @return
	 */
	public boolean updateByHql(String hql);
	public boolean updateBySql(String sql);
	
	/**
	 * 查询所有对象
	 */
//	public List<T> findAll();
	public List<T> findAll(String className);
	
	/**
	 * 根据不同条件查询对象，并返回list
	 */
	public List<T> findByCriteria(Criterion... criterions);

	/**
	 * 根据不同条件查询对象，并返回list
	 * 添加了排序功能
	 */
	public List<T> findByCriteria(Order order, Criterion... criterions);
	
	/**
	 * 根据不同条件查询对象，并返回list
	 * 添加了排序功能
	 * 带分页功能
	 */
	public List<T> findByCriteria(int firstResult, int rowCount, Order order,
			Criterion... criterions);
	/**
	 * 根据一个对象查询该类对象的集合
	 * @param 需要查询的一个具体对象类型
	 * @return 查询到的集合(泛型)
	 */
	public List<T> findByHql(Object object);
	
	/**
	 * 带分页查询的hql查询
	 * @param hql
	 * @param 本次查询最多需要查询多少条记录
	 * @param 第一条记录的下标
	 * @return
	 */
	public List<T> findByHql(String hql, int maxResult, int firstResult);
	
	public List<T> findByHql(String hql);
	
	/**
	 * 根据sql语句进行查询
	 * @param 要执行的sql语句
	 * @param 集合的类型所在的类的全名
	 *        ,如java.lang.Integer或com.shu.model.User;
	 * @return 一个类对象
	 */
	public List<T> findBySql(String sql,String fullClass);
	
	public List<T> findBySql(String hql, int maxResult, int firstResult);
	
	
	public List<T> findByProperty(String className,String property,Object value);
	
	public T findSingleByProperty(String className,String property,Object value);

	/**
	 * 通过主键查找对象 
	 * @return Object
	 */
	public T findById(String className,Serializable id); 
	
	/**
	 * 通过主键查找对象、并加锁
	 * @return Object
	 */
	public T findById(String className,Serializable id, boolean lock);
	
	public void delete(T object);
}
